package com.fang.algorithm.zuo.sort;

import com.fang.algorithm.common.PrintUtils;

/**
 * @author fanglingxiao
 * @version 1.0
 * @description Math函数Math.random()会返回[0, 1)的等概率的值
 * 那如何返回一个[0,1)的随机数的概率为x的平方
 * @date 2022/1/14 12:58 上午
 **/
public class Test05_Random {
    public static void main(String[] args) {
        int time = 1000000;
        double count = 0;
        double x = 0.5;
        for (int i = 0; i < time; i++) {
            if (xToXPower2() < x) {
                count++;
            }
        }
        System.out.println(count / (double) time);
        System.out.println(Math.pow(x, 2));

        System.out.println("======");
        System.out.println("验证由1-5等概率返回1-7");
        int[] counts = new int[8];
        for (int i = 0; i < time; i++) {
            int index = equalPReturn1To7();
            counts[index]++;
        }
        PrintUtils.printArr(counts);
    }

    public static double xToXPower2() {
        // Math.random() x的概率为x，那两者取并集则概率为x平方
        return Math.max(Math.random(), Math.random());
    }

    /**
     * 由 1-5 等概率 返回 1-7 返回
     */
    public static int equalPReturn1To7() {
        return (f2() << 2) + (f2() << 1) + f2();
    }

    // 基于f1等概率返回0和1
    public static int f2() {
        int ans = 0;
        do {
            ans = f1();
        } while (ans == 3);
        return ans < 3 ? 0 : 1;
    }

    // 等概率返回1-5
    public static int f1() {
        return (int) (Math.random() * 5) + 1;
    }
}
